/**
 * 定义项目中各种需要用到的typescript接口类型数据结构
 */
import {RouteLocationNormalized, RouteRecordRaw} from 'vue-router';
/**
 * keepalive缓存用到的路由实体单元
 */
export interface CachedView extends Partial<RouteLocationNormalized> {
    title?: string;
}

/**
 * 与服务端的异步接口：返回的数据结构
 */
export interface ResponseConfig {
    code: string,
    data: any,
    success: boolean,
    msg: string|null
}
/**
 * 在store中keepalive已缓存的页面，以及在多页签下已打开的页面
 */
export interface CacheViewState {
    // visitedViews: TagView[];
    cachedViews: string[]; //keepalive缓存页面
}
/**
 * 在store中的用户状态信息数据结构
 */
export interface UserState {
    token?: string, //不是sessionId就是token; 仅在getInfo、login返回用户信息时由服务端传入，前端存储时不保存
    staffId: string,
    staffName: string,
    staffType:number, //WEG人员身份类型； 0游客、1渠道商、2店铺、3普通LT员、4LT人员-基地管理员客服、5LT人员省分管理员客服
    provinceCode:string,
    avatar?: string,
    phoneNum?: string,
    // roles?: string[];
    // perms?: string[];
}
/**
 * 文件API类型声明
 */
export interface FileInfo {
    name: string,
    url: string,
}

/**
 * 客服人员组
 */
export interface WaiterGroup {
    label:string,
    list: Array<CustWaiter>,
}

/**
 * 客服人员单元
 */
export interface CustWaiter {
    waiterName: string,
    wxId: string,
    phone: string,
}

/**
 * 搜索商品结果结构体
 */
export interface SearchGoodsItem {
    gdsId:string,
    gdsImg:string,
    gdsName:string,
    titleExt?:string,
    agentPrice:number,
    guidePrice?:number,
    saleAmount?:number,
    hasCoupon?:false,
    noStork?:false,
    shopId?:string,
    shopName?:string,
    shopType?:string,
}

/**
 * 搜索店铺结果结构体
 */
export interface SearchShopItem {
    shopId: string,
    shopShortName: string,
    shopName?:string,
    logoPath?: string,  //string '店铺logo',
    busiProvinceCode?: string,  //string 业务范围:全国或某省编码,
    shopType: string,  //string 店铺类型,
    shopCat: string, //string 主营范围，为商品分类若干一级节点编号，逗号隔开的字串
    offlineSupported:  string, //string 是否支持线下支付0否 1支持
    hotShowSupported?:  string, //string 是否热门店铺 0否 1支持
    cloubSupplier:  string, //string 是否优品小店供货商 0否 1是
    allowBackDay: number,  //number允许退货天数
    createTime: string, //string 开店时间
    cautionMoney?: number, //保障金，万元，无保障金是为0
    offers: Array<any>,
    checked?:boolean, //批量管理中是否选中？一般仅用于关注店铺中的批量管理功能，后台不回传值
    isFollowed?:boolean, //店铺是否被用户关注？如果当前用户不是渠道或不是关注店铺查询，则不返回该字段
}

/**
 * 搜索商品过滤条件
 */
export interface SearchGoodsCondition {
    inStork:0|1,          //是否有货
    inReplaceGrant:0|1,   //是否一件代发
    innerKey?:string,           //内部继续搜索用的关键字
    locate:string,            //收货地区编码，来自于用户配置的收货地址区域
    minPrice:number|'',            //价格区间最低
    maxPrice:number|'',            //价格区间最高
 //   sortType:string,                             //排序规则 0综合 1销量 2价格升序 3价格降序 默认
    shopId?:string,            //店铺内搜索时专用的字段
    shopList:string[],         //筛选条件中选中店铺的列表，与shopId二选一
    brandList:string[],        //筛选条件中选中品牌的列表
    catId:string,            //商品分类节点（不是path-list）
}

/**
 * 搜索店铺过滤条件
 */
export interface SearchShopsCondition {
    innerKey?:string,           //内部继续搜索用的关键字
    shopType:string,            //店铺类型
    locate:string,              //string渠道收货地址省分地市，必填，用来约束店铺的业务省分范围（全国、某个指定省，实际只用到省分的值
    catIds:string[], // string[] //主营范围：选择内容为商品类型树一级节点，可默认为空数组
    isHot:number,    //0/1 是否热门店铺
    isCloubSupplier:number, // 0/1 是否优品小店供货商
}

/**
 * 销量榜单商品单元
 */
export interface TopSaleItem {
    gdsId:string,
    gdsImg:string,
    gdsName:string,
    titleExt?:string,
    agentPrice:number,
    guidePrice?:number,
    saleAmount?:number,
}

/**
 * demo中，商品类型用的定义结构(暂定，未来定要改)
 */
export interface GoodsBaseItem{
    gdsId: string, //商品id
    gdsName:string, //商品名称,
    titleExt:string, //商品副标题,
    saleAmount: number, //销量
    gdsPicList:string[], // 商品图片列表，第一张是主图
    params:{name:string, value:string}[],//商品参数列表
    isLadder: string,//是否使用了阶梯价定义 1是，0否
    isPreSale: string,//是否是预售商品 1是，0否
    isDerate: string, //是否减免运费,1:减免 0:不减免
    isTicket: string, //是否开票，1:是 0:否
    insured: string, //是否有价保 1：有价保  0：无价保
    ifBargainPay: string, //是否支持定金支付 0:不支持 1：支持定金支付
    autoReplaceGrant: string, //是否支持优品小店设置，0/空=否、1=是
    businessModel: string, //业务模式 0原来模式 1一件代发 2厂家直发
    iosSellFlag: string, //苹果售点标识:1-是，0-否
    minBuyCount: number,//最小起订量，默认为1
    limitedBuNum: number,//最多限购几台？0表示不限制
    gdsDesc: string,//获取商品详细介绍用的长串id编码
    shopId: string,//归属的店铺id,
}

/**
 * 商品详情、购物车中展示的活动列表
 */
export interface GoodsActivity{
    activityId:string, //活动ID
    activityTheme:string,//活动主题名称
    typeCategory:string, //活动优惠分类：01单品优惠 02订单优惠 03外围优惠;
                         // 01单品优惠与阶梯价有冲突，不能同时出现，阶梯价优于单品优惠
    typeCode:string,//活动类型编码：
    typeName:string,//活动类型名称：
    activityContent:string,//活动内容'国庆满299减20国庆满299减20国庆满299减20国庆满299减20国庆满299减20',
    endDate:string,//活动截止日期'2023-12-31',
    activityPrice?:number, //活动折价力度，即售价减多少钱，单位元 0表或undefined示不减
    SurplusStock?:number|0,  //参与折价活动限量多少件单品，0或undefined表示不限量
    activityMinAmount?:number|1,  //参与活动最少要买多少减商品，默认1件
    canBuy?:true, //是否是能作用到购买售价的活动true,还是仅作文字展示的活动false
    checked?:boolean, //当前活动是否被用户选中？该属性仅用在页面逻辑效果中，后台不必回传
}

/**
 * 优惠券单元
 */
export interface CouponItem {
    coupIssueId:string,
    couponAmount:number,
    activeType:number,
    activeDay?:number,
    activeTime?:string,
    inactiveTime?:string,
    controlMsg:string,
    limitMsg:string,
    couponTypeName:string,
    remainAmount:number|null,
    acquiredAmount:number,
    maxAcquireAmount:number,
}

/**
 * 单品属性单元
 */
export interface SkuPropItem {
    propId: string,
    propValue: string,
    params: Array<{
        vId:string,
        vName:string,
        vImg?:string,
    }>,
}
/**
 * 单品实体单元
 */
export interface SkuItem {
    gdsId: string,
    skuId: string,
    skuPrice: number,
    stockAmount?:number,
    selectNum?:number,
    skuImg?:string, //单品图片；一般在套包中才直接从后台返回
    params?: Array<{
        propId:string,
        propValue:string,
        vId:string,
        vName:string
    }>,
}

/**
 * 阶梯价设定单元
 */
export interface PriceLadderItem {
    buyMinAmount:number, //该档位最小购买件数总量
    buyMaxAmount:number, //该档位最大购买件数总量,如果不限最大值则为0
    afterAmountPrice:number, //总购买量满足该档位时的价格，分
}

/**
 * 单品项、单品属性集合
 */
export interface SkuStruct {
    sbShopStatus:string,  //店铺壮态，是否还有效存续
    gdsStatus: string,    //商品状态，是否还有效且为上架状态
    storkTotal:number, //所有单品总库存，为0时表示“区域无货”
    minGuidePrice:number, //最小的指导价
    maxGuidePrice:number, //最大的指导价
    minAgentPrice:number, //最小的提货价
    maxAgentPrice:number, //最大的提货价
    skus?:SkuItem[],
    props?:SkuPropItem[],
    priceLadders?:PriceLadderItem[]
}

/**
 * 商品套包数据最小单元
 */
export interface GdsPackageGroupItem {
    gdsList: {
        gdsId: string, //商品id
        gdsName: string, //商品名称
        gdsImg?: string, //商品的主图，PC端才用，移动端不需要
        minPrice: number, //商品的最小价格，登录后是套包内的提货价，登录前是指导价
        maxPrice: number, //商品的最小价格，登录后是套包内的提货价，登录前是指导价
        skus:SkuItem[], //该商品单元内一共有多少种单品可选, 该分组包含skus.length款SKU
        ifSeparately:'1'|'2', //是否可以单独购买,1可以单独购买 2不可以单独购买
    }[], //分组中按商品分列呈现的列表，一个分组中可以有N个商品、N*M个单品
    ratio: number, //可选总数为${gdsPackageGroupVO.ratio}的倍数。默认1，不能为小数
    selectNum?:number, //已选X件
    waitNum?: number, //待选N件
    reduceNum?:number, //组合购买优惠金额，目前暂时不做
}
/**
 * 商品套包行数据
 */
export interface GdsPackage{
    packageId:string, //套包ID
    packageName: string, //套包名称
    packageDesc: string, //套包描述
    groupList:GdsPackageGroupItem[], //套包中的分组list，默认第一个分组为商品详情页中的主商品，其余为套包绑定商品
}

/**
 * 收藏商品展示单元
 */
export interface FavoritesGoodsItem {
    gdsId:string,
    gdsImg:string,
    gdsName:string,
    agentPrice:number,
    oldPrice?:number,
    gdsStatus:string,//1有效 0已下架 2无货
    shopId:string,
    checked?:boolean, //当前是否已选中？
    isFollowed?:boolean, //货品是否被用户收藏？如果当前是收藏商品查询，则不返回该字段
}

/**
 * 购物车子分组商品内的sku单品单元
 */
export interface CartSku {
    skuId:string,
    propNames:string[], //该SKU的各种属性名称拼接数组，展示名称时将从前往后排列展示，用“&middot;”拼接
    skuImg?:string,
    skuPrice: number, //原始的SKU提货价
    realSkuPrice?: number, //减去优惠、补贴后的SKU提货价,后台不返回，仅用于前端展示
    discountType: string, //本SKU价格的折扣类型： 0默认无；1直降优惠；2补贴
    discountPrice: number|0, //折扣减去了多少钱？默认0
    minAmount:number, //最小购买量，默认为1；也可以是当有限购时，单笔订单最小购买量
    maxAmount:number, //默认为库存；也可以是当有限购时，单笔订单最大购买量
    selectNum?:number,  //当前已选多少件？默认=minAmount，该属性仅用在页面逻辑效果中，后台不必回传
    selectAllPrice?:number, //结合可能存在的阶梯价，计算出当前SKU已选数量下的总价。该属性仅用在页面逻辑效果中，后台不必回传
    checked?:boolean, //当前SKU是否被用户选中？该属性仅用在页面逻辑效果中，后台不必回传
}

/**
 * 购物车子分组店铺内所选的商品单元
 */
export interface CartGoods {
    gdsId: string,
    gdsName:string,
    gdsImg:string,
    priceLadders:PriceLadderItem[], //阶梯价设定，严格按购买量从少到多顺序排列，如果无则返回空数组; 阶梯价优先于skuPrice和realSkuPrice
    skuList: CartSku[], //该商品中有哪些SKU在购物车中
    activityList:GoodsActivity[], //该商品带有哪些正在进行的可用活动？后台返回时，需默认选中类型为折价，且降价最多的那个。
                                  // 如果没有降价类的活动，则默认选中开始日期最近的那个
    checked?:boolean, //当前商品是否被用户选中？该属性仅用在页面逻辑效果中，后台不必回传
}

/**
 * 购物车大分组（按店铺）单元
 */
export interface CartGroup {
    shopId: string, //店铺ID
    shopName: string, //店铺名称，默认shortName
    shopType:string, //店铺类型
    shopActInfo?:Array<{actType:string,actNum?:number,discountPrice?:number}>, //店铺级活动列表信息（可同时显示多个在进行的店铺级活动）
    // 其单元定义：actType:店铺级活动类型：1包邮、2满减
    //actNum: 满足条件的数量，满几件包邮，满XX元立减   discountPrice：使用满减时，直降的金额，单位分
    coupons:CouponItem[], //该店铺在购物车中的商品一共可以领哪些店铺内的优惠券？为空时须返回数组
    gdsList:CartGoods[], //该店铺在购物车中的商品列表
    checked?:boolean, //当前店铺是否被用户选中？该属性仅用在页面逻辑效果中，后台不必回传
}

/**
 * 活动专区的楼层里，每个活动下的商品信息
 */
export interface ActGds {
    gdsId:string,
    gdsName:string,
    gdsImg:string,
    // shopId:string,
    // shopName:string,
    beforePrice?:number,//活动前价格
    realPrice:number,//活动中的提货价
    buysNum:number, //已售量
    residueNum:number,//剩余量
}

/**
 * 活动专区里层楼展示的活动实体
 * 活动专区中，如果楼层所有展示截止时间小于当前时间，则楼层直接不展示、楼层标签也不返回前台！
 */
export interface ActInfo {
    activityId:string,
    activityTheme:string,//活动主题名称
    typeCategory:string, //活动优惠分类：01单品优惠 02订单优惠 03外围优惠;
    typeName:string,//活动类型名称
    activityContent:string,//活动内容'国庆满299减20国庆满299减20国庆满299减20国庆满299减20国庆满299减20',
    endTime:string,//活动截止时间'2023-12-31 23:50:59',
    isActEnd:boolean, //活动是否结束
    gdsList:ActGds[], //参与活动商品集合
}

/**
 * 活动专区的楼层信息
 * 楼层基本信息读取完后，再取活动详情列表
 */
export interface ActFloor {
    floorId:string,
    color?:string, //楼层主题色，默认是网站的主题色
    bannerImgs?:string[],//楼层展示活动前的宣传展示图，可多张顺序展示，紧贴无边距
                         //PC端与移动端的banner图列不同，因此前端请求时，务必传终端标志，以便让后台区别返回适配哪种终端的banner图
}

/**
 * 订单搜索查询条件
 */
export interface  SearchOrderCondition {
    ordStatus:string,  //订单状态
    key:string,						//查询关键字 （货品名称/订单号）
    linker:string,					//联系人姓名
    linkPhone:string,				//联系人电话
    ordFrom:string,                 //来源类型 ‘’:不限 0:本平台 1:撮合系统 2:优品小店  3:京东
    maxMoney:string,                 //订单金额最大值(元)
    minMoney:string,                 //订单金额最小值(元)
    timeType:string,                //查询时间段类型： ‘1’：3月内  ‘2’：3月前  ‘3’：自定义
    dateRange:string[]|null         //自定义时的查询时间范围
}

/**
 * 主订单下各个SKU构成的子订单信息
 */
export interface SubOrderItem {
    subId: string,                 //子订单号
    status: string,                //子订单状态，参考主订单状态；要考虑部分发货、部分退货的场景
    payMoney: number,              //子订单的支付金额，小于等于SKU单价*订购数量的金额
    gdsId: string,                 //商品ID
    gdsName: string,               //商品名称
    skuId: string,                 //SKU的skuId
    skuInfo: string,               //SKU的单品属性选项信息，以/符号分隔，比如  原谅绿/12+512G
    picture: string,               //该SKU的图片
    orderAmount:number,            //该SKU的订购数量
    skuUnitPrice:number,           //该该SKU的单价
}

/**
 * 订单列表中的订单基本信息
 */
export interface OrderBaseItem {
    orderId: string,               //订单号
    orderFrom: string,             //订单来源类型： ‘’:不限 0:本平台 1:撮合系统 2:优品小店  3:京东
    orderTime: string,             //下单时间
    realMoney: number,             //订单实付款额
    shippingMoney: number,         //运费金额
    status: string,                //订单状态
    shopId: string,                //大B店铺ID
    shopName: string,              //大B店铺的短名称
    shopType: string,              //店铺类型
    ordSubs: SubOrderItem[],       //子订单信息
}
